﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<functional>
using namespace std;
struct Goods
{
	string _name; // 名字
	double _price; // 价格
	int _evaluate; // 评价
	Goods(const char* str, double price, int evaluate)
		:_name(str)
		, _price(price)
		, _evaluate(evaluate)
	{}
};
struct ComparePriceLess
{
	bool operator()(const Goods& gl, const Goods& gr)
	{
		return gl._price < gr._price;
	}
};
struct ComparePriceGreater
{
	bool operator()(const Goods& gl, const Goods& gr)
	{
		return gl._price > gr._price;
	}
};
//int main()
//{
//	vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2,
//   3 }, { "菠萝", 1.5, 4 } };
//	sort(v.begin(), v.end(), ComparePriceLess());
//	sort(v.begin(), v.end(), ComparePriceGreater());
//	auto add = [](int a, int b)mutable -> int { return a + b; };
//	cout << add(3, 5) << endl;
//}

//int main()
//{
//	int a = 3, b = 5;
//	auto add = [&a, &b]()
//	{
//		a++;//当为值传递且没有muttable修饰时要修改a报错
//		return a + b;
//	};
//	cout<< add()<<endl;
//	cout << a << endl;
//	return 0;
//}
//class Rate
//{
//public:
//	Rate(double rate) : _rate(rate)
//	{}
//	double operator()(double money, int year)
//	{
//		return money * _rate * year;
//	}
//private:
//	double _rate;
//};
//int main()
//{
//	// 函数对象
//	double rate = 0.015;
//	Rate r1(rate);
//	r1(10000, 2);
//	// lambda
//	auto r2 = [=](double money, int year)->double 
//	{
//		return money * rate * year;
//	};
//	r2(10000, 2);
//	return 0;
//}
//#include <iostream>
//#include <vector>
//#include <algorithm>
//using namespace std;
//class MyClass {
//	int value;
//public:
//	MyClass(int initialValue) : value(initialValue) {}
//	void incrementValue() {
//		// 使用Lambda表达式来增加value的值
//		auto incLambda = [this]() mutable { ++this->value; };
//		incLambda();
//	}
//	void printValue() const {
//		// 使用Lambda表达式来打印value的值
//		auto printLambda = [this]() { cout << "Value: " << this->value << endl; };
//		printLambda();
//	}
//};
//
//int main() {
//	MyClass obj(5);
//	obj.incrementValue();
//	obj.printValue(); // 应该输出 Value: 6
//	return 0;
//}
// 使用方法如下：
//int f(int a, int b)
//{
//	return a + b;
//}
//struct Functor
//{
//public:
//	int operator() (int a, int b)
//	{
//		return a + b;
//	}
//};
//
//class Plus
//{
//public:
//	static int plusi(int a, int b)
//	{
//		return a + b;
//	}
//	double plusd(double a, double b)
//	{
//		return a + b;
//	}
//};
//int main()
//{
//	//// 函数名(函数指针)
//	//function<int(int, int)> func1 = f;
//	//cout << func1(1, 2) << endl;
//	//// 函数对象
//	//function<int(int, int)> func2 = Functor();
//	//cout << func2(1, 2) << endl;
//	//// lamber表达式
//	//function<int(int, int)> func3 = [](int a,int b)
//	//{ return a + b; };
//	//cout << func3(1, 2) << endl;
//
//	//类的成员函数
//	function<int(int, int)> func4 = &Plus::plusi;
//	cout << func4(1, 2) << endl;
//	//用法一
//	function<double(Plus, double, double)> func5 = &Plus::plusd;
//	cout << func5(Plus(), 1.1, 2.2) << endl;
//	//用法二
//	function<double(Plus*, double, double)> func6 = &Plus::plusd;
//	Plus tmp;
//	cout << func6(&tmp, 1.1, 2.2) << endl;
//	return 0;
//}


//int evalRPN(vector<string>& tokens) {
//	map<string, function<int(int, int)>> opfunc = {
//		{"+",[](int x,int y) { return x + y; }},
//		{"-",[](int x,int y) { return x - y; }},
//		{"*",[](int x,int y) { return x * y; }},
//		{"/",[](int x,int y) { return x / y; }},
//	};
//	stack<int> q;
//	for (auto& e : tokens)
//	{
//		if (e == "+" || e == "-" || e == "*" || e == "/")
//		{
//			int num1 = q.top();
//			q.pop();
//			int num2 = q.top();
//			q.pop();
//			q.push(opfunc[e](num1, num2));
//		}
//		else
//		{
//			q.push(stoi(e));
//		}
//	}
//	return q.top();
//}
// 使用举例
using namespace placeholders;
//int Plus(int a, int b)
//{
//	return a + b;
//}
class Sub
{
public:
	int sub(int a, int b)
	{
		return a - b;
	}
};
int main()
{
	////表示绑定函数plus 参数分别由调用 func1 的第一，二个参数指定,将placeholders空间
	////展开后即可直接使用_x.
	//function<int(int, int)> func1 = bind(Plus, placeholders::_1,_2);
	////func2的类型为 function<int（int, int)> 与func1类型一样
	////表示绑定函数 plus 的第一，二为： 10， 20，即可不用传参
	//auto  func2 = bind(Plus, 10, 20);
	//// 参数调换顺序
	//auto Div = [](int a, int b) { return a / b; };
	//auto func3 = bind(Div, _2, _1);
	//cout << func1(1, 2) << endl;
	//cout << func2() << endl;
	//cout << func3(20, 60);
	// 绑定成员函数
	Sub s;
	function<int(int, int)> func4 = bind(&Sub::sub, s, _1, _2);
	cout << func4(1, 2) << endl;
	return 0;
}
